package 高级进阶;

import org.junit.Test;

/**
 * @author Liangyaoyun
 */
//Object[] b=(E[])new Object[10];强制转换类型要在new上面加上目标类型；
public class 我的ArrayList {
    public class MyArrayList<E> {
        //存储元素的数组
        private E[] array;
        //记录元素的总个数
        private Integer total = 0;
        public MyArrayList(int length) {
            //如果想手动设置大小，调用这个
            array = (E[]) new Object[length];
        }
        public MyArrayList() {
            //实例化数组,并且设置初始值是10
            this(10);
        }
        public void add(E e) {
            if (total >= array.length) {
                E[] newArray = (E[]) new Object[array.length + 10];
                for (int i = 0; i < array.length; i++) {
                    newArray[i] = array[i];
                }
                array = newArray;
                array[total] = e;
                total++;
            } else {
                array[total] = e;
                total++;
            }
        }

        public E get(Integer index) {
            if (index < total) {
                return array[index];
            } else {
                throw new ArrayIndexOutOfBoundsException("数组越界");
            }
        }
    }
    @Test
    public void test() {
    }
}
//宇哥代码
//public class TempTest {
//
//    @SuppressWarnings("all")
//    public class MyArrayList<E> {
//
//        /**
//         * 用来存储元素的数组
//         */
//        private E[] array;
//
//        /**
//         * 用来记录当前一共存储了多少个元素
//         */
//        private Integer total = 0;
//
//        public MyArrayList(int initSize) {
//            // 实例化数组
//            array = (E[]) new Object[initSize];
//        }
//
//        public MyArrayList() {
//            this(10);
//        }
//
//        public void add(E e) {
//            // 如果数组已经满了，扩容数组
//            if (total >= array.length) {
//                E[] newArray = (E[]) new Object[array.length + 10];
//                // p1: 原数组
//                // p2: 从原数组的哪个位置开始复制
//                // p3: 新数组
//                // p4: 在新数组的哪个位置开始粘贴
//                // p5: 拷贝多长
//                System.arraycopy(array, 0, newArray, 0, array.length);
//                // 将用户要添加的值存入新数组
//                newArray[total] = e;
//                // 交换引用
//                array = newArray;
//            }
//            // 如果数组没满，将元素添加到数组中
//            else {
//                array[total] = e;
//            }
//            total++;
//        }
//
//        public E get(int index) {
//            // 如果index参数越界了，抛异常
//            if (index >= array.length) {
//                throw new ArrayIndexOutOfBoundsException("数组越界了");
//            }
//
//            // 如果index参数没有越界，返回对应位置上的元素
//            return array[index];
//        }
//    }
